package com.itheima.demo; // 声明包路径，表示这个类位于com.itheima.demo包下

import java.util.Scanner; // 导入Scanner类，用于从键盘读取用户输入

public class Test { // 定义Test类，作为程序的入口类
    // main方法：程序的入口点，JVM会首先执行这里的代码
    public static void main(String[] args) {
        // 目标：加油站支付小程序。
        // 1、创建卡片类，以便创建金卡或者银卡对象，封装车主的数据。
        // 2、定义一个卡片父类：Card,定义金卡和银卡的共同属性和方法。
        // 3、定义一个金卡类，继承Card类：金卡必须重写消费方法（8折优惠），独有功能打印洗车票。
        // 3、定义一个银卡类，继承Card类：银卡必须重写消费方法（9折优惠）
        // 4、办一张金卡：创建金卡对象。交给一个独立的业务（支付机）来完成：存款，消费。
        // 创建一个GoldCard对象，传入车牌号、用户名、手机号和初始余额
        GoldCard goldCard = new GoldCard("鄂A860MM", "dlei", "18665616520", 5000);
        goldCard.deposit(100); // 调用deposit方法向金卡中存入100元
        pay(goldCard); // 调用pay方法，传入金卡对象进行支付操作（多态应用）

        // 4、办一张银卡：创建银卡对象。交给一个独立的业务（支付机）来完成：存款，消费。
        // 创建一个SilverCard对象，传入车牌号、用户名、手机号和初始余额
        SilverCard silverCard = new SilverCard("粤A88888", "dlei", "18984724244", 2000);
        pay(silverCard); // 调用pay方法，传入银卡对象进行支付操作（多态应用）
    }

    // 支付机：用一个方法来刷卡： 可能接收金卡，也可能接收银卡。
    // 这里使用Card类型作为参数，体现了面向对象的多态特性
    // Card是父类类型，可以接收任何Card的子类对象（GoldCard或SilverCard）
    public static void pay(Card c){ // 定义静态pay方法，参数c的类型为Card
        System.out.println("请刷卡,请您输入当前消费的金额："); // 提示用户输入消费金额
        Scanner sc = new Scanner(System.in); // 创建Scanner对象，用于读取用户输入
        double money = sc.nextDouble(); // 读取用户输入的双精度浮点数作为消费金额
        c.consume(money); // 调用传入对象的consume方法
        // 这里体现了多态：根据传入的实际对象类型（GoldCard或SilverCard），
        // 自动调用对应的子类中重写的consume方法，而不是父类的方法
    }
    }
